﻿using System.Collections.Generic;

#nullable enable

namespace NewRetail.Application.Components.WeChat.CardVoucher.Model
{
    public class WeChatCardCreateInputDto
    {
        /// <summary>
        /// appId
        /// </summary>
        public string AppId { get; set; } = string.Empty;
        /// <summary>
        /// 会员卡类型
        /// </summary>
        public string CardType { get; set; } = string.Empty;
        /// <summary>
        /// 会员卡特权说明,限制1024汉字
        /// </summary>
        public string Prerogative { get; set; } = string.Empty;
        /// <summary>
        /// 基本的卡券数据
        /// </summary>
        public CardBaseInfoDto Base { get; set; } = new CardBaseInfoDto();
        /// <summary>
        /// 获取或设置卡券高级信息。
        /// </summary>
        public CardAdvanceInfoDto AdvanceInfo { get; set; } = new CardAdvanceInfoDto();
        /// <summary>
        /// 获取或设置是否领取后自动激活。
        /// </summary>
        public bool? IsAutoActivate { get; set; }

        /// <summary>
        /// 获取或设置是否支持一键开卡。
        /// </summary>
        public bool? IsWechatActivate { get; set; }

        /// <summary>
        /// 获取或设置是否支持跳转型一键激活。
        /// </summary>
        public bool? IsWechatActivateAfterSubmit { get; set; }

        /// <summary>
        /// 获取或设置激活会员卡外链。
        /// </summary>
        [Newtonsoft.Json.JsonProperty("activate_url")]
        [System.Text.Json.Serialization.JsonPropertyName("activate_url")]
        public string? ActivateUrl { get; set; }

        /// <summary>
        /// 获取或设置激活会员卡对应的小程序原始 ID。
        /// </summary>
        public string? ActivateBrandMiniProgramUsername { get; set; }

        /// <summary>
        /// 获取或设置激活会员卡对应的小程序页面路径。
        /// </summary>
        public string? ActivateBrandMiniProgramPath { get; set; }

        /// <summary>
        /// 获取或设置跳转型一键激活的跳转外链。
        /// </summary>
        public string? WechatActivateAfterSubmitUrl { get; set; }

        /// <summary>
        /// 获取或设置是否支持积分。
        /// </summary>
        public bool IsSupplyBonus { get; set; }

        /// <summary>
        /// 获取或设置查看积分详情外链。
        /// </summary>
        public string? BonusUrl { get; set; }

        /// <summary>
        /// 获取或设置积分清零规则。
        /// </summary>
        public string? BonusClearedString { get; set; }

        /// <summary>
        /// 获取或设置积分规则。
        /// </summary>
        public string? BonusRulesString { get; set; }

        /// <summary>
        /// 获取或设置积分规则。
        /// </summary>
        public CardBonusRuleInfoDto? BonusRule { get; set; }

        /// <summary>
        /// 获取或设置是否支持储值。
        /// </summary>
        public bool IsSupplyBalance { get; set; }

        /// <summary>
        /// 获取或设置查看余额详情外链。
        /// </summary>
        public string? BalanceUrl { get; set; }

        /// <summary>
        /// 获取或设置储值规则。
        /// </summary>
        public string? BalanceRules { get; set; }

        /// <summary>
        /// 获取或设置自定义会员信息类目 1 信息。
        /// </summary>
        public CardCustomFieldInfoDto? CustomField1 { get; set; }

        /// <summary>
        /// 获取或设置自定义会员信息类目 2 信息。
        /// </summary>
        public CardCustomFieldInfoDto? CustomField2 { get; set; }

        /// <summary>
        /// 获取或设置自定义会员信息类目 3 信息。
        /// </summary>
        public CardCustomFieldInfoDto? CustomField3 { get; set; }

        /// <summary>
        /// 获取或设置自定义会员服务入口 1 信息。
        /// </summary>
        public CardCustomCellInfoDto? CustomCell1 { get; set; }

        /// <summary>
        /// 获取或设置自定义会员服务入口 2 信息。
        /// </summary>
        public CardCustomCellInfoDto? CustomCell2 { get; set; }

        /// <summary>
        /// 获取或设置自定义会员服务入口 3 信息。
        /// </summary>
        public CardCustomCellInfoDto? CustomCell3 { get; set; }

        /// <summary>
        /// 获取或设置折扣优惠。
        /// </summary>
        public int? Discount { get; set; }
    }

    public class CardBaseInfoDto
    {
        /// <summary>
        /// 卡券的商户logo，建议像素为300*300。
        /// </summary>
        public string LogoUrl { get; set; } = string.Empty;
        /// <summary>
        /// 获取或设置码型。
        /// </summary>
        public string CodeType { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置商户名字。
        /// </summary>
        public string BrandName { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置卡券名。
        /// </summary>
        public string Title { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置卡券颜色。
        /// </summary>
        public string Color { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置卡券使用提醒。
        /// </summary>
        public string Notice { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置卡券使用说明。
        /// </summary>
        public string Description { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置商品信息。
        /// </summary>
        public CardSKUDto Sku { get; set; } = new CardSKUDto();

        /// <summary>
        /// 获取或设置使用日期信息。
        /// </summary>
        public CardDateInfoDto DateInfo { get; set; } = new CardDateInfoDto();

        /// <summary>
        /// 获取或设置是否自定义券码。
        /// </summary>
        public bool? UseCustomCode { get; set; }

        /// <summary>
        /// 获取或设置是否指定用户领取。
        /// </summary>
        public bool? IsBindOpenId { get; set; }

        /// <summary>
        /// 获取或设置客服电话。
        /// </summary>
        public string? ServicePhoneNumber { get; set; }

        /// <summary>
        /// 获取或设置门店 Id 列表。
        /// </summary>
        public IList<long>? LocationIdList { get; set; }

        /// <summary>
        /// 获取或设置是否支持全部门店。
        /// </summary>
        public bool? UseAllLocations { get; set; }

        /// <summary>
        /// 获取或设置显示在顶部居中的按钮文字。
        /// </summary>
        public string? CenterTitle { get; set; }

        /// <summary>
        /// 获取或设置显示在入口下方的提示语。
        /// </summary>
        public string? CenterSubTitle { get; set; }

        /// <summary>
        /// 获取或设置顶部居中的 URL。
        /// </summary>
        public string? CenterUrl { get; set; }

        /// <summary>
        /// 获取或设置自定义跳转外链的入口名字。
        /// </summary>
        public string? CustomUrlTitle { get; set; }

        /// <summary>
        /// 获取或设置自定义跳转外链的入口右侧提示语。
        /// </summary>
        public string? CustomUrlSubTitle { get; set; }

        /// <summary>
        /// 获取或设置自定义跳转外链。
        /// </summary>
        public string? CustomUrl { get; set; }

        /// <summary>
        /// 获取或设置营销场景的入口名称。
        /// </summary>
        public string? PromotionUrlName { get; set; }

        /// <summary>
        /// 获取或设置营销场景的入口右侧的提示语。
        /// </summary>
        public string? PromotionUrlSubTitle { get; set; }

        /// <summary>
        /// 获取或设置营销场景外链。
        /// </summary>
        public string? PromotionUrl { get; set; }

        /// <summary>
        /// 获取或设置每人可领券的数量限制。
        /// </summary>
        public int? GetLimitPerUser { get; set; }

        /// <summary>
        /// 获取或设置卡券领取页面是否可分享。
        /// </summary>
        public bool? CanShare { get; set; }

        /// <summary>
        /// 获取或设置卡券是否可转赠。
        /// </summary>
        public bool? CanGiveFriend { get; set; }

        /// <summary>
        /// 填写true为用户点击进入会员卡时推送事件，默认为false。详情见 进入会员卡事件推送。
        /// </summary>
        public bool? NeedPushOnView { get; set; }
    }

    public class CardSKUDto
    {
        /// <summary>
        /// 获取或设置卡券库存的数量。
        /// </summary>
        public int Quantity { get; set; } = 100000000;
    }

    public class CardDateInfoDto
    {
        /// <summary>
        /// 获取或设置使用时间的类型。
        /// </summary>
        public string Type { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置起用时间戳。
        /// </summary>
        public long? BeginTimestamp { get; set; }

        /// <summary>
        /// 获取或设置过期时间戳。
        /// </summary>
        public long? EndTimestamp { get; set; }

        /// <summary>
        /// 获取或设置自领取后 N 天内有效。
        /// </summary>
        public int? FixedTerm { get; set; }

        /// <summary>
        /// 获取或设置自领取后 N 天后生效。
        /// </summary>
        public int? FixedBeginTterm { get; set; }
    }

    public class CardAdvanceInfoDto
    {
        /// <summary>
        /// 获取或设置使用门槛信息。
        /// </summary>
        public CardUseConditionInfoDto? UseCondition { get; set; }

        /// <summary>
        /// 获取或设置封面摘要信息。
        /// </summary>
        public CardAbstractInfoDto? Abstract { get; set; }

        /// <summary>
        /// 获取或设置图文列表。
        /// </summary>
        public IList<CardTextImageInfoDto>? TextImageList { get; set; }

        /// <summary>
        /// 获取或设置商家服务类型。
        /// </summary>
        public IList<string>? BusinessServiceList { get; set; }

        /// <summary>
        /// 获取或设置使用时段限制列表。
        /// </summary>
        public IList<CardTimeLimitInfoDto>? TimeLimitList { get; set; }
    }

    public class CardUseConditionInfoDto
    {
        /// <summary>
        /// 获取或设置可用的商品类目。
        /// </summary>
        public string? AcceptCategory { get; set; }

        /// <summary>
        /// 获取或设置不可用的商品类目。
        /// </summary>
        public string? RejectCategory { get; set; }

        /// <summary>
        /// 获取或设置满减门槛（单位：分）。
        /// </summary>
        public int LeastCost { get; set; }

        /// <summary>
        /// 获取或设置可用类型门槛。
        /// </summary>
        public string? ObjectUseFor { get; set; }

        /// <summary>
        /// 获取或设置是否可与其他类型共享门槛。
        /// </summary>
        public bool? CanUseWithOtherDiscount { get; set; }
    }

    public class CardAbstractInfoDto
    {
        /// <summary>
        /// 获取或设置封面摘要简介。
        /// </summary>
        public string Description { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置封面图片 URL 列表。
        /// </summary>
        public IList<string>? IconUrlList { get; set; }
    }

    public class CardTextImageInfoDto
    {
        /// <summary>
        /// 获取或设置图片描述。
        /// </summary>
        public string Text { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置封面图片 URL。
        /// </summary>
        public string ImageUrl { get; set; } = string.Empty;
    }

    public class CardTimeLimitInfoDto
    {
        /// <summary>
        /// 获取或设置限制类型。
        /// </summary>
        public string Type { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置起始时间小时（格式：H）。
        /// </summary>
        public int? BeginHour { get; set; }

        /// <summary>
        /// 获取或设置起始时间分钟（格式：m）。
        /// </summary>
        public int? BeginMinute { get; set; }

        /// <summary>
        /// 获取或设置结束时间小时（格式：H）。
        /// </summary>
        public int? EndHour { get; set; }

        /// <summary>
        /// 获取或设置结束时间小时（格式：m）。
        /// </summary>
        public int? EndMinute { get; set; }
    }

    public class CardBonusRuleInfoDto
    {
        /// <summary>
        /// 获取或设置单次消费金额（单位：分）。
        /// </summary>
        public int? CostMoneyUnit { get; set; }

        /// <summary>
        /// 获取或设置对应增加的积分。
        /// </summary>
        public int? IncreaseBonus { get; set; }

        /// <summary>
        /// 获取或设置单次可获取的积分上限。
        /// </summary>
        public int? MaxIncreaseBonus { get; set; }

        /// <summary>
        /// 获取或设置初始积分。
        /// </summary>
        public int? InitialIncreaseBonus { get; set; }

        /// <summary>
        /// 获取或设置单次消费积分。
        /// </summary>
        public int? CostBonusUnit { get; set; }

        /// <summary>
        /// 获取或设置积分抵扣金额（单位：分）。
        /// </summary>
        public int? ReduceMoney { get; set; }

        /// <summary>
        /// 获取或设置积分抵扣门槛（单位：分）。
        /// </summary>
        public int? LeastMoneyToUseBonus { get; set; }

        /// <summary>
        /// 获取或设置单次可使用积分的上限。
        /// </summary>
        public int? MaxReduceBonus { get; set; }
    }

    public class CardCustomFieldInfoDto
    {
        /// <summary>
        /// 获取或设置会员信息类目自定义名称类型。
        /// </summary>
        public string? NameType { get; set; }

        /// <summary>
        /// 获取或设置会员信息类目自定义名称。
        /// </summary>
        public string? Name { get; set; }

        /// <summary>
        /// 获取或设置点击类目跳转外链。
        /// </summary>
        public string? Url { get; set; }
    }

    public class CardCustomCellInfoDto
    {
        /// <summary>
        /// 获取或设置入口名称。
        /// </summary>
        public string Name { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置入口右侧提示语。
        /// </summary>
        public string Tips { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置入口跳转链接。
        /// </summary>
        public string Url { get; set; } = string.Empty;
    }

    public class CardDetailQueryInputDto
    {
        public string AppId { get; set; } = string.Empty;
        public string CardId { get; set; } = string.Empty;
    }

    public class CardQrcodeCreateInputDto
    {
        /// <summary>
        /// appId
        /// </summary>
        public string AppId { get; set; } = string.Empty;
        /// <summary>
        /// 获取或设置二维码有效期（单位：秒）。
        /// </summary>
        public int? ExpiresIn { get; set; }

        /// <summary>
        /// 获取或设置二维码类型。
        /// </summary>
        public string ActionName { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置二维码详细信息。
        /// </summary>
        public QrCodeActionInfoDto Action { get; set; } = new QrCodeActionInfoDto();
        
    }
    public class QrCodeActionInfoDto
    {
        public QrCodeCardDto? Card { get; set; }
    }
    public class QrCodeCardDto
    {
        /// <summary>
        /// 获取或设置卡券模板编号。
        /// </summary>
        public string CardId { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置卡券 Code。
        /// </summary>
        public string? CardCode { get; set; }
        /// <summary>
        /// 获取或设置指定领取者的 OpenId。
        /// </summary>
        public string? OpenId { get; set; }

        /// <summary>
        /// 获取或设置二维码是否领取后不可再次扫描。
        /// </summary>
        public bool? IsUnique { get; set; }

        /// <summary>
        /// 获取或设置商家自定义数值。
        /// </summary>
        public int? OuterId { get; set; }

        /// <summary>
        /// 获取或设置商家自定义字符串。
        /// </summary>
        public string? OuterString { get; set; }
    }

    public class CardMemberCardActivateInputDto
    {
        /// <summary>
        /// appId
        /// </summary>
        public string AppId { get; set; } = string.Empty;
        /// <summary>
        /// 获取或设置卡券模板编号。
        /// </summary>
        public string CardId { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置商户自定义字符串。
        /// </summary>
        public string? OuterString { get; set; }
    }

    public class WeChatCardListQueryInputDto
    {
        /// <summary>
        /// appId
        /// </summary>
        public string AppId { get; set; } = string.Empty;
        /// <summary>
        /// 获取或设置分页起始位置。
        /// </summary>
        public int Offset { get; set; }

        /// <summary>
        /// 获取或设置分页每页数量。
        /// </summary>
        public int Limit { get; set; } = 10;

        /// <summary>
        /// 获取或设置指定状态列表。
        /// 值为： “CARD_STATUS_NOT_VERIFY”, 待审核 ； “CARD_STATUS_VERIFY_FAIL”, 审核失败； “CARD_STATUS_VERIFY_OK”， 通过审核； “CARD_STATUS_DELETE”， 卡券被商户删除； “CARD_STATUS_DISPATCH”， 在公众平台投放过的卡券；
        /// </summary>
        public IList<string>? StatusList { get; set; }
    }
    public class WeChatCardDeleteInputDto
    {
        /// <summary>
        /// appId
        /// </summary>
        public string AppId { get; set; } = string.Empty;
        /// <summary>
        /// 获取或设置卡券模板编号。
        /// </summary>
        public string CardId { get; set; } = string.Empty;
    }
    public  class CardMemberTestWhiteListInputDto
    {
        /// <summary>
        /// appId
        /// </summary>
        public string AppId { get; set; } = string.Empty;
        /// <summary>
        /// 获取或设置测试用户的 OpenId 列表。
        /// </summary>
        public IList<string>? OpenIdList { get; set; }

        /// <summary>
        /// 获取或设置测试用户的微信号列表。
        /// </summary>
        public IList<string>? UserNameList { get; set; }
    }

    public class CardMemberUserInfoInputDto
    {
        /// <summary>
        /// appId
        /// </summary>
        public string AppId { get; set; } = string.Empty;
        /// <summary>
        /// 获取或设置卡券模板编号。
        /// </summary>
        public string CardId { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置卡券 Code。
        /// </summary>
        public string CardCode { get; set; } = string.Empty;
    }
    public class CardMemberDecryptCodeInputDto
    {
        /// <summary>
        /// appId
        /// </summary>
        public string AppId { get; set; } = string.Empty;
        /// <summary>
        /// 获取或设置经过加密的卡券 Code。
        /// </summary>
        public string EncryptedCardCode { get; set; } = string.Empty;
    }

    public class CardMemberQueryCodeInputDto
    {
        /// <summary>
        /// appId
        /// </summary>
        public string AppId { get; set; } = string.Empty;
        /// <summary>
        /// 获取或设置卡券模板编号。
        /// </summary>
        public string? CardId { get; set; }

        /// <summary>
        /// 获取或设置卡券 Code。
        /// </summary>
        public string CardCode { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置是否校验核销状态。
        /// </summary>
        public bool? RequireCheckConsume { get; set; }

    }

    public class WeChatCardUserCardInputDto
    {
        /// <summary>
        /// appId
        /// </summary>
        public string AppId { get; set; } = string.Empty;
        /// <summary>
        /// CardId
        /// </summary>
        public string CardId { get; set; } = string.Empty;

        /// <summary>
        /// OpenId
        /// </summary>
        public string OpenId { get; set; } = string.Empty;
    }

    public class UpdateWeChatUserMemberCardInputDto
    {
        /// <summary>
        /// appId
        /// </summary>
        public string AppId { get; set; } = string.Empty;
        /// <summary>
        /// CardId
        /// </summary>
        public string CardId { get; set; } = string.Empty;

        /// <summary>
        /// OpenId
        /// </summary>
        public string OpenId { get; set; } = string.Empty;
        public int Bounus { get; set; }
        public int ModifiedBounus { get; set; }
        public string ModifiedBounusRecord { get; set; } = string.Empty;
    }
}
